﻿using Autofac;
using wwl.Application.Services.Rbac;
using wwl.Contract.Interfaces.Rbac;
using wwl.DataAccess.Repositories.Rbac;

namespace wwl.WebApi.AutofacModeules.Rbac
{
  /// <summary>
  /// 权限模块（Rbac）的Autofac服务注册模块（WebApi层）
  /// 集中注册权限模块中租户相关的领域服务与仓储实现，与通用模块分离，体现按业务边界组织依赖注入的思想
  /// 继承Autofac的<see cref="Module"/>类，实现权限模块服务的模块化注册
  /// </summary>
  public class RbacModule : Module
  {
    /// <summary>
    /// 重写模块加载方法，注册权限模块（Rbac）中租户相关的服务与接口映射
    /// </summary>
    /// <param name="builder">Autofac容器构建器，用于定义服务注册规则</param>
    protected override void Load(ContainerBuilder builder)
    {
      // 注册租户专属仓储：将TenantRepository实现类与ITenantRepository接口关联
      // 生命周期为InstancePerLifetimeScope（每个请求生命周期内单例），与数据上下文保持一致
      // 作用：使应用层通过ITenantRepository接口调用租户专属数据操作，隔离具体实现
      builder.RegisterType<TenantRepository>()
          .As<ITenantRepository>()
          .InstancePerLifetimeScope();

      // 注册租户领域服务：将TenantService实现类与ITenantService接口关联
      // 生命周期为InstancePerLifetimeScope，确保同一请求中服务实例唯一，避免状态混乱
      // 作用：使接口层（如Controller）通过ITenantService接口调用租户业务逻辑，解耦接口与实现
      builder.RegisterType<TenantService>()
          .As<ITenantService>()
          .InstancePerLifetimeScope();

      // 注册用户专属仓储：将UserRepository实现类与IUserRepository接口关联
      // 生命周期为InstancePerLifetimeScope，与数据上下文生命周期保持一致
      // 作用：封装用户相关的数据访问操作，为应用层提供统一的数据访问接口
      builder.RegisterType<UserRepository>()
          .As<IUserRepository>()
          .InstancePerLifetimeScope();

      // 注册用户领域服务：将UserService实现类与IUserService接口关联
      // 生命周期为InstancePerLifetimeScope，确保同一请求中服务实例唯一
      // 作用：封装用户相关的业务逻辑（如用户认证、信息更新、密码重置等），为接口层提供业务服务
      builder.RegisterType<UserService>()
          .As<IUserService>()
          .InstancePerLifetimeScope();
    }
  }
}